

#ifndef MPPT_INCC_F_H_ // 头文件保护宏，防止重复包含
#define MPPT_INCC_F_H_
#include "MY_INC/TI_SOLAR/SOLAR_F.h"
//*********** 结构体定义 ***********//
typedef struct
{
    // 输入参数
    float32 Ipv;      // 输入：当前光伏电池电流（A）
    float32 Vpv;      // 输入：当前光伏电池电压（V）
    float32 IpvH;     // 输入：电流变化量上限阈值（抗干扰阈值）
    float32 IpvL;     // 输入：电流变化量下限阈值
    float32 VpvH;     // 输入：电压变化量上限阈值
    float32 VpvL;     // 输入：电压变化量下限阈值
    float32 MaxVolt;  // 输入：允许的最大输出电压（V）
    float32 MinVolt;  // 输入：允许的最小输出电压（V）
    float32 Stepsize; // 输入：电压调整步长（V）
    float32 VmppOut;  // 输出：计算出的最大功率点电压（V）

    // 内部状态变量
    float32 Cond;        // 当前电导值（I/V）
    float32 IncCond;     // 增量电导值（ΔI/ΔV）
    float32 DeltaV;      // 电压变化量（当前V - 上次V）
    float32 DeltaI;      // 电流变化量（当前I - 上次I）
    float32 VpvOld;      // 上一次的电压值（V）
    float32 IpvOld;      // 上一次的电流值（A）
    float32 StepFirst;   // 初始步长（首次扰动幅度）
    int16   mppt_enable; // MPPT使能标志（1=启用）
    int16   mppt_first;  // 首次运行标志（1=初始化阶段）
} MPPT_INCC_F;

typedef MPPT_INCC_F *mppt_incc_handle; // 结构体指针类型定义

//*********** 函数声明 ***********//
void MPPT_INCC_F_init(MPPT_INCC_F *v); // 初始化结构体成员
void MPPT_INCC_F_FUNC(MPPT_INCC_F *v); // 主计算函数（C语言实现）

//*********** 核心处理宏 ***********//
// 适用于电压型电导增量法
static inline void MPPT_INCC_F_MACRO(MPPT_INCC_F* v)
{
    if (v->mppt_enable == 1)
    { /* MPPT功能使能 */
        if (v->mppt_first == 1)
        {                                    /* 首次运行初始化 */
            v->VmppOut = v->Vpv - v->StepFirst; // 初始电压扰动（后退步长）
            v->VpvOld = v->Vpv;                // 记录当前电压为历史值
            v->IpvOld = v->Ipv;                // 记录当前电流为历史值
            v->mppt_first = 0;                // 清除首次运行标志
        }
        else
        {
            v->DeltaV = v->Vpv - v->VpvOld; // 计算电压变化量
            v->DeltaI = v->Ipv - v->IpvOld; // 计算电流变化量

            if (v->DeltaV == 0.0f)
            { /* 电压无变化时的处理 */
                if (v->DeltaI != 0.0f)
                { /* 仅电流变化时的方向判断 */
                    if (v->DeltaI > 0.0f)
                        v->VmppOut = v->Vpv + v->Stepsize; // 若电流增加则增加电压
                    else
                        v->VmppOut = v->Vpv - v->Stepsize; // 否则减少电压
                }
            }
            else
            {                                      /* 电压变化时的电导增量法核心逻辑 */
                v->Cond = v->Ipv / (v->Vpv);          // 计算当前电导 (I/V)
                v->IncCond = v->DeltaI / (v->DeltaV); // 计算增量电导 (ΔI/ΔV)

                if (v->IncCond != v->Cond)
                {
                    if (v->IncCond > (-v->Cond))          // 判断是否在MPP左侧（ΔI/ΔV > -I/V）
                        v->VmppOut = v->Vpv + v->Stepsize; // 向左调整电压
                    else
                        v->VmppOut = v->Vpv - v->Stepsize; // 向右调整电压
                }
            }
            /* 电压限幅保护 */
            v->VmppOut = (v->VmppOut < v->MinVolt) ? v->MinVolt : v->VmppOut; // 下限钳位
            v->VmppOut = (v->VmppOut > v->MaxVolt) ? v->MaxVolt : v->VmppOut; // 上限钳位

            v->VpvOld = v->Vpv; // 更新历史电压值
            v->IpvOld = v->Ipv; // 更新历史电流值
        }
    }
}


#endif /*MPPT_INCC_F_H_*/
